
// 统一处理错误信息
const handleError=(event)=>{
console.log('handleError',event);

}

/**
 * @description: 
 * @param {String} message 错误信息
 * @param {String} source 发生错误的脚本URL
 * @param {Number} lineno 发生错误的行号
 * @param {Number} colno 发生错误的列号
 * @param {Object} error 对象
 * @return: 
 */
const  formatRuntimerError =(message,source,lineno,colno,error)=>{
    return{
        type:ERROR_RUNTIME,
        desc:`${message}at${source}:${lineno}:${colno}`,
        stack:error && error.stack?error.stack:'no stack'
    }
}

/**
 * @description: 
 * @param {Object}  errorTarget 错误信息
 * @return: 
 */
const formatLoadError = (errorTarget)=>{
return{
    type:LOAD_ERROR_TYPE[errorTarget.nodeName.toUpperCase()],
    desc:`${errorTarget.baseURI  }@${  errorTarget.src || errorTarget.href}`,
    stack:'no stack'
}
}
export const listenerErrorPlugin  = ()=>{
    window.addEventListener('error',function(event){
        const errorTarget = event.target
        const errorName = errorTarget.nodeName.toUpperCase()
        const {message, filename,lineno,colno,error} = event
        console.log('errorevent',event);
        if(errorTarget !== window && errorTarget.nodeName&& LOAD_ERROR_TYPE[errorName]){
            handleError(formatLoadError(errorTarget))
        }else{
            // onerror 会被覆盖，因此转为使用Listener 进行监控
            const {message, filename,lineno,colno,error} = event
            console.log('errorevent',event);
            
            handleError(formatRuntimerError(message,filename,lineno,colno,error))
        }
    },true)
    // 监听浏览器中捕获到未处理的Promsie 错误
window.addEventListener('unhandledrejection',function(event){
    handleError(event)
},true)
// 针对报错重写console.error
console.error = (function (origin){
    return function (info){
        console.log('origin',origin);
        console.log('info',info);
        
        // const errorLog = {
        //     type:ERROR_CONSOLE,
        //     desc:info
        // }
        // handleError(errorLog)
        // origin.call(console,info)
    }
})(console.error)
}

